//package com.itisyue.fun.controller;
//
//import com.itisyue.fun.service.FileService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.core.io.FileSystemResource;
//import org.springframework.core.io.Resource;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpRange;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestHeader;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.File;
//import java.io.IOException;
//import java.io.OutputStream;
//import java.io.RandomAccessFile;
//import java.util.List;
//
//
//@Slf4j
//@RestController
//public class FileControllerV1 {
//    private static final int CHUNK_SIZE = 1 * 1024 * 1024; // 分块大小1MB[3,7](@ref)
//
//    @Autowired
//    private FileService fileService;
//
//    @GetMapping("/fileV1")
//    public ResponseEntity<Resource> getFile(
//            @RequestParam String filePath,
//            @RequestHeader(value = HttpHeaders.RANGE, required = false) String rangeHeader,
//            HttpServletResponse response) throws IOException {
//
//        File file = new File(filePath); // 文件存在性校验
//        Resource resource = new FileSystemResource(file);
//
//        // 启用HTTP分块传输编码[3,7](@ref)
//        response.setHeader(HttpHeaders.TRANSFER_ENCODING, "chunked");
//        response.setHeader("X-Accel-Buffering", "no");
//
//        if (rangeHeader != null && rangeHeader.startsWith("bytes=")) {
//            return handleRangeRequest(file, rangeHeader, response);
//        } else {
//            return fullFileResponse(resource, file);
//        }
//    }
//
//    // 处理断点续传请求[7](@ref)
//    private ResponseEntity<Resource> handleRangeRequest(File file, String rangeHeader, HttpServletResponse response)
//        throws IOException {
//
//        long fileSize = file.length();
//        Range range = parseRangeHeader(rangeHeader, fileSize);
//
//        // 分块读取逻辑[3,7](@ref)
//        try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
//            raf.seek(range.getStart());
//            byte[] buffer = new byte[CHUNK_SIZE];
//            int bytesRead;
//
//            try (OutputStream os = response.getOutputStream()) {
//                while ((bytesRead = raf.read(buffer, 0, CHUNK_SIZE)) != -1
//                        && range.getStart() < range.getEnd()) {
//                    os.write(buffer, 0, bytesRead);
//                    range.setStart(range.getStart() + bytesRead);
//                }
//            }
//        }
//
//        // 设置HTTP 206状态码[7](@ref)
//        return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
//                .header(HttpHeaders.CONTENT_RANGE, "bytes " + range.getStart() + "-" +
//                        range.getEnd() + "/" + fileSize)
//                .build();
//    }
//
//    // 完整文件响应（兼容非分块请求）
//    private ResponseEntity<Resource> fullFileResponse(Resource resource, File file) {
//        return ResponseEntity.ok()
//                .header(HttpHeaders.CONTENT_DISPOSITION,
//                        "attachment; filename=\"" + file.getName() + "\"")
//                .header(HttpHeaders.CONTENT_TYPE, "application/octet-stream")
//                .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(file.length()))
//                .body(resource);
//    }
//
//    private Range parseRangeHeader(String rangeHeader, long fileSize) {
//        try {
//            // 解析HTTP Range头（如"bytes=0-1023"）
//            List<HttpRange> ranges = HttpRange.parseRanges(rangeHeader);
//
//            if (ranges.isEmpty()) {
//                throw new IllegalArgumentException("Invalid Range header");
//            }
//
//            // 获取第一个范围（通常大文件下载只需处理单个范围）
//            HttpRange httpRange = ranges.get(0);
//
//            // 计算实际范围值
//            long start = httpRange.getRangeStart(fileSize);
//            long end = httpRange.getRangeEnd(fileSize);
//
//            // 处理未指定结束位置的情况（如"bytes=1024-"）
//            if (end == Long.MAX_VALUE) {
//                end = fileSize - 1;
//            }
//
//            // 校验范围合法性
//            if (start < 0 || end >= fileSize || start > end) {
//                throw new IllegalArgumentException(
//                        "Range exceeds file size: " + start + "-" + end + "/" + fileSize
//                );
//            }
//
//            return new Range(start, end);
//
//        } catch (Exception ex) {
//            throw new IllegalArgumentException("Invalid Range format", ex);
//        }
//    }
//}